<?php

namespace App\Models;

use Image;

/**
 * 图片模型
 * 负责图片的上传
 */
class Picture extends BaseModel
{
    protected $table = "picture";

    /**
     * 默认上传配置
     */
    public $config = [
        'mimes' => ['png', 'gif', 'jpg'], //允许上传的文件MiMe类型
        'maxSize' => 2097152, //上传的文件大小限制 (0-不做限制) 当前为2M，计算方式 2*1024*1024
        'maxNum' => 5, //上传的文件数量限制 (0-不做限制)
        'savePath' => '/uploads/goods/imgs/', //保存路径
        'saveExt' => 'jpg', //文件保存后缀，空则使用原后缀
        'cut' => 1, //是否裁剪 (0-不做限制)
        'cutSize' => '400,400', //裁剪尺寸（宽,高） 400,400  (0-不裁剪)
        'cut_Mini_Size' => '60,60', //裁剪小图尺寸（宽,高） 60,60    (0-不裁剪)
    ];

    protected $rules = [
        'admin_id' => 'required',
        'shop_id' => 'required',
        'goods_id' => 'required',
        'path' => 'required',
        'url' => 'required',
        'filesize' => 'required',
    ];

    protected $message = [
        'admin_id.required' => '用户ID获取失败',
        'shop_id.required' => '店铺ID获取失败',
        'goods_id.required' => '商品ID获取失败',
        'path.required' => '图片路径获取失败',
        'url.required' => '图片url获取失败',
        'filesize.required' => '文件大小获取失败',
    ];

    /** 上传商品图片
     * @param $goodsId   商品ID
     * @return bool
     */
    public function upload($goodsId, $savePath = '', $files = [])
    {
        $data = [];
        if (!$savePath) {
            //商品图片按照店铺ID归类,路径以每个商户ID命名单独创建文件夹保存该商户的图片
            $savePath = $this->config['savePath'] . plat_admin_id() . '/';
        }
        $path = public_path() . $savePath;
        //检查文件夹是否存在，不存在则创建
        if (!is_dir($path)) {
            mkdir($path, 0755);
        }
        $pics = $files ? $files : request('pics', []);
//        if (!empty($pics)) {
//            foreach ($pics as $k => $v) {
//                if (strpos($v, '?')) {
//                    $pics[$k] = explode('?', $v)[0];
//                }
//            }
//        }
        if ($this->config['maxNum']) {
            if (count($pics) > $this->config['maxNum']) {
                $this->error = '上传图片数量超过限制，最多只能上传' . $this->config['maxNum'] . '张!';
                return false;
            }
        }

        for ($i = 0; $i < $this->config['maxNum']; $i++) {
            //商品图片命名规则：商品ID_（当前循环键值+1） 例如：1_1.jpg
            $saveName = $goodsId . '_' . ($i + 1);
            //判断实际图片数量在库存中数量是否一致，通过数组下标进行判断
            if (!isset($pics[$i])) {
                //如果不存在，则判断库存中是否存在多于实际数量的无用老图片，存在则进行清除操作
                $oldFile = $path . $saveName . '.' . $this->config['saveExt'];
                if (file_exists($oldFile)) {
                    unlink($oldFile);//如果存在则删除
                }
                //判断是否还存在无用的小图片，有则直接删除
                if ($this->config['cut_Mini_Size']) {
                    $miniSize = explode(',', $this->config['cut_Mini_Size']);
                    $oldMiniFile = $path . $saveName . '_' . $miniSize[0] . '.' . $this->config['saveExt'];
                    if (file_exists($oldMiniFile)) {
                        unlink($oldMiniFile);
                    }
                }
                continue; //多余数据清除操作完毕进入下个循环
            }

            //已有图片则直接重新按照规则给文件重新命名
            if (file_exists(public_path() . $pics[$i])) {
                $arr = explode('.', $pics[$i]);
                //重命名前需删除同名无用文件
                if (public_path() . $pics[$i] != $path . $saveName . '.' . $arr[1] && file_exists($path . $saveName . '.' . $arr[1])) {
                    unlink($path . $saveName . '.' . $arr[1]);
                }
                if (public_path() . $pics[$i] == $path . $saveName . '.' . $arr[1]) {
                    continue;
                }
                rename(public_path() . $pics[$i], $path . $saveName . '.' . $arr[1]);
                if ($this->config['cut_Mini_Size']) {
                    $miniSize = explode(',', $this->config['cut_Mini_Size']);
                    $oldMiniFile = public_path() . $arr[0] . '_' . $miniSize[0] . '.' . $arr[1];
                    //重命名前需删除同名无用文件
                    if ($oldMiniFile != $path . $saveName . '_' . $miniSize[0] . '.' . $arr[1] && file_exists($path . $saveName . '_' . $miniSize[0] . '.' . $arr[1])) {
                        unlink($path . $saveName . '_' . $miniSize[0] . '.' . $arr[1]);
                    }
                    rename($oldMiniFile, $path . $saveName . '_' . $miniSize[0] . '.' . $arr[1]);
                }
                continue;
            }
            //新入库图片则进行完整上传流程
            preg_match('/^data:image\/(jpeg|png|gif);base64,/u', $pics[$i], $arr);
            if (empty($arr)) {
                $this->error = '上传图片文件损坏，无法获取图片信息，请重新上传!';
                return false;
            }
            $saveExt = $arr[1] == 'jpeg' ? 'jpg' : $arr[1];
            if (!in_array($saveExt, $this->config['mimes'])) {
                $this->error = '上传图片文件类型不符，请上传正确格式的文件!';
                return false;
            }
            if ($this->config['saveExt']) {
                $saveExt = $this->config['saveExt'];
            }
            $img = Image::make($pics[$i]);
            if ($this->config['maxSize']) {
                $fileSize = strlen(str_replace('=', '', str_replace('data:' . $img->mime() . ';base64,', '', $pics[$i])));
                $imgSize = $fileSize - ($fileSize / 8) * 2;
                if ($imgSize > $this->config['maxSize']) {
                    $this->error = '上传图片过大!';
                    return false;
                }
            }
            $data[$i]['url'] = $savePath . $saveName . '.' . $saveExt;
            $data[$i]['path'] = $path . $saveName . '.' . $saveExt;
            //是否需要裁剪
            if (!$this->config['cut']) {
                $img->save($data[$i]['path'], 80);
                $data[$i]['filesize'] = number_format($img->filesize() / 1024, 2);
                continue;
            }
            //原图裁剪尺寸
            if ($this->config['cutSize']) {
                $cutSize = explode(',', $this->config['cutSize']);
                if (file_exists($data[$i]['path'])) {
                    unlink($data[$i]['path']);
                }
                $img->fit($cutSize[0], $cutSize[1])->save($data[$i]['path'], 80);
                $data[$i]['filesize'] = number_format($img->filesize() / 1024, 2);
            }
            //小图裁剪尺寸
            if ($this->config['cut_Mini_Size']) {
                $miniSize = explode(',', $this->config['cut_Mini_Size']);
                if (file_exists($path . $saveName . '_' . $miniSize[0] . '.' . $saveExt)) {
                    unlink($path . $saveName . '_' . $miniSize[0] . '.' . $saveExt);
                }
                //小图片命名规则：商品图片名_小图裁剪尺寸  例如：1_1_60.jpg
                $img->fit($miniSize[0], $miniSize[1])->save($path . $saveName . '_' . $miniSize[0] . '.' . $saveExt, 80);
            }
//            $data[$k]['admin_id'] = plat_admin_id();
//            $data[$k]['shop_id'] = intval(trim(request('shop_id')));
//            $data[$k]['goods_id'] = $goodsId;
//            $data[$k]['status'] = 1;
//            $data[$k]['created_at'] = date('Y-m-d H:i:s');
//            $data[$k]['updated_at'] = date('Y-m-d H:i:s');
            //图片入库，目前暂时不入库
//            $res = $this->_add($data[$k]);
//            if (!$res) {
//                $this->error = '保存商品图片失败，请重新上传商品图片!';
//                return false;
//            }
            $img->destroy();
        }
        return true;
    }

    public function add($imgArr)
    {
        if (!(is_array($imgArr) && !empty($imgArr))) {
            $this->error = '无法获取商品图片信息，请重新上传商品图片!';
            return false;
        }
        if (!$this->_validate($imgArr)) {
            return false;
        }
        $res = $this->_add($imgArr);
        if (!$res) {
            $this->error = '保存商品图片失败，请重新上传商品图片!';
            return false;
            //记录行为
//            action_log('update_shop', 'shop', $id);
        }
        return $res;
    }


}